import axios from 'axios'
import env from './env'
import Vue from 'vue'
// 扩展Promise两个方法
Promise.prototype.done = function (onFulfilled, onRejected) {
  this.then(onFulfilled, onRejected)
    .catch(function (reason) {
      // 抛出一个全局错误
      setTimeout(() => {
        throw reason
      }, 0)
    })
}
Promise.prototype.finally = function (callback) {
  let P = this.constructor
  return this.then(
    value => P.resolve(callback()).then(() => value),
    reason => P.resolve(callback()).then(() => {
      throw reason
    })
  )
}
let instance = axios.create({
  baseURL: env.baseUrl,
  headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
  // withCredentials: true
})

instance.interceptors.request.use((config) => {
  // 设置content-type为application/x-www-form-urlencoded时发送数据的格式
  if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=utf-8') {
    var params = new URLSearchParams()
    if (config.data) {
      for (let i in config.data) {
        if (config.data[i] !== undefined && config.data[i] !== null && config.data[i] !== '') {
          params.append(i, config.data[i])
        }
      }
    }
    config.data = params
  }
  // 设置请求token
  let UBToken = localStorage.getItem('UBToken')
  config.headers && UBToken && (config.headers.UBToken = UBToken)
  return config
})

instance.interceptors.response.use((res) => {
  // res 拦截器
  if (res.data && res.data.code === -1) {
    // 未登入 或者 登入态失效
    Vue.prototype.$message({
      type: 'warning',
      message: res.data.msgZ,
      duration: 1000,
      onClose: () => {
        location.href = '/admin/sys/login'
      }
    })
    localStorage.removeItem('UBToken')
    return res
  }
  if (res.data && 'code' in res.data && res.data.code !== 1 && res.data.code < 100) {
    // TODO 处理 或者 提示 相应返回失败的结果
    console.log(res)
    Vue.prototype.$message({
      type: 'warning',
      message: res.data.msgZ
    })
    // return Promise.reject()
    return res
  }
  return res
})
// 二期接口
let instance2 = axios.create({
  baseURL: env.baseUrl2,
  headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
  // withCredentials: true
})

instance2.interceptors.request.use((config) => {
  // 设置content-type为application/x-www-form-urlencoded时发送数据的格式
  if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=utf-8') {
    var params = new URLSearchParams()
    if (config.data) {
      for (let i in config.data) {
        if (config.data[i] !== undefined && config.data[i] !== null && config.data[i] !== '') {
          params.append(i, config.data[i])
        }
      }
    }
    config.data = params
  }
  // 设置请求token
  let UBToken = localStorage.getItem('UBToken')
  config.headers && UBToken && (config.headers.UBToken = UBToken)
  return config
})

instance2.interceptors.response.use((res) => {
  // res 拦截器
  if (res.data && res.data.code === -1) {
    // 未登入 或者 登入态失效
    Vue.prototype.$message({
      type: 'warning',
      message: res.data.msgZ,
      onClose: () => {
        location.href = '/admin/sys/login'
      }
    })
    localStorage.removeItem('UBToken')
    return res
  }
  if (res.data && 'code' in res.data && res.data.code !== 1 && res.data.code < 100) {
    // TODO 处理 或者 提示 相应返回失败的结果
    console.log(res)
    Vue.prototype.$message({
      type: 'warning',
      message: res.data.msgZ
    })
    return Promise.reject()
  }
  return res
})
// 三期接口
let instance3 = axios.create({
  baseURL: env.baseUrl3,
  headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'}
  // withCredentials: true
})

instance3.interceptors.request.use((config) => {
  // 设置content-type为application/x-www-form-urlencoded时发送数据的格式
  if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=utf-8') {
    var params = new URLSearchParams()
    if (config.data) {
      for (let i in config.data) {
        if (config.data[i] !== undefined && config.data[i] !== null) {
          params.append(i, config.data[i])
        }
      }
    }
    config.data = params
  }
  // 设置请求token
  let UBToken = localStorage.getItem('UBToken')
  config.headers && UBToken && (config.headers.UBToken = UBToken)
  return config
})

instance3.interceptors.response.use((res) => {
  // res 拦截器
  // console.log(res)
  if (res.data && res.data.code === -1) {
    // 未登入 或者 登入态失效
    Vue.prototype.$message({
      type: 'warning',
      message: res.data.msgZ,
      onClose: () => {
        location.href = '/admin/sys/login'
      }
    })
    localStorage.removeItem('UBToken')
    return res
  }
  if (res.data && 'code' in res.data && res.data.code !== 1 && res.data.code < 100) {
    // TODO 处理 或者 提示 相应返回失败的结果
    const response = res.data
    const codes = [3]  // 不需要message提示的response.code集
    if(codes.indexOf(response.code) > -1) {
      return Promise.reject()
    }
    Vue.prototype.$message({
      type: 'warning',
      message: res.data.msgZ
    })
    return Promise.reject()
  }
  return res
}, (error) => {
  // console.error("axios error")
  // console.error(error)
  // location.href = '/admin/sys/login'
  return Promise.reject(error)
})
export {instance as axios, instance2 as axios2, instance3 as axios3}
